home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
dev
/
c
/
cxref_1_4a.lha
/
comment.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-12-07
|
6KB
|
294 lines
/***************************************
$Header: /home/amb/cxref/RCS/comment.c 1.16 1997/11/20 20:14:20 amb Exp $
C Cross Referencing & Documentation tool. Version 1.4a.
Collects the comments from the parser.
******************/ /******************
Written by Andrew M. Bishop
This file Copyright 1995,96 Andrew M. Bishop
It may be distributed under the GNU Public License, version 2, or
any higher version. See section COPYING of the GNU Public license
for conditions under which this file may be redistributed.
***************************************/
/*+ Turn on the debugging in this file. +*/
#define DEBUG 0
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "memory.h"
#include "datatype.h"
#include "cxref.h"
#ifdef AMIGA /* olsen */
#include "amiga.h"
#endif /* AMIGA */
static void TidyCommentString(char **string);
/*+ The file that is currently being processed. +*/
extern File CurFile;
/*+ The current (latest comment). +*/
static char* cur_comment=NULL;
/*++++++++++++++++++++++++++++++++++++++
Function that is called when a comment or part of one is seen. The comment is built up until an end of comment is signaled.
char* c The comment text. If c==0 then it is a file (/ * * comment * * /) comment
if c==1 then it is the other special comment (/ * + comment + * /).
if c==2 then it is a normal comment (/ * comment * /).
if c==3 then it is not a comment.
++++++++++++++++++++++++++++++++++++++*/
void SeenComment(char* c)
{
static int comment_ended=0;
switch((int)c)
{
case 0:
#if DEBUG
printf("#Comment.c# Seen comment /**\n%s\n**/\n",cur_comment);
#endif
TidyCommentString(&cur_comment);
if(!CurFile->comment)
SeenFileComment(cur_comment);
cur_comment=NULL;
comment_ended=1;
break;
case 1:
#if DEBUG
printf("#Comment.c# Seen comment /*+\n%s\n+*/\n",cur_comment);
#endif
TidyCommentString(&cur_comment);
if(SeenFuncIntComment(cur_comment))
cur_comment=NULL;
comment_ended=1;
break;
case 2:
#if DEBUG
printf("#Comment.c# Seen comment /*\n%s\n*/\n",cur_comment);
#endif
TidyCommentString(&cur_comment);
if(!CurFile->comment)
{SeenFileComment(cur_comment); cur_comment=NULL;}
comment_ended=1;
break;
case 3:
comment_ended=0; cur_comment=NULL;
break;
default:
if(comment_ended)
{comment_ended=0; cur_comment=NULL;}
cur_comment=ConcatStrings(2,cur_comment,c);
}
}
/*++++++++++++++++++++++++++++++++++++++
Provide the current (latest) comment.
char* GetCurrentComment Returns the current (latest) comment.
++++++++++++++++++++++++++++++++++++++*/
char* GetCurrentComment(void)
{
char* c=cur_comment;
#if DEBUG
printf("#Comment.c# GetCurrentComment returns <<<%s>>>\n",cur_comment);
#endif
cur_comment=NULL;
return(c);
}
/*++++++++++++++++++++++++++++++++++++++
Set the current (latest) comment.
char* comment The comment.
++++++++++++++++++++++++++++++++++++++*/
void SetCurrentComment(char* comment)
{
#if DEBUG
printf("#Comment.c# SetCurrentComment set to <<<%s>>>\n",comment);
#endif
cur_comment=comment;
}
/*++++++++++++++++++++++++++++++++++++++
A function to split out the arguments etc from a comment,
for example the function argument comments are separated using this.
char* SplitComment Returns the required comment.
char** original A pointer to the original comment, this is altered in the process.
char* name The name that is to be cut out from the comment.
A most clever function that ignores spaces so that 'char* b' and 'char *b' match.
++++++++++++++++++++++++++++++++++++++*/
char* SplitComment(char** original,char* name)
{
char* c=NULL;
if(*original)
{
int l=strlen(name);
c=*original;
do{
int i,j,failed=0;
char* start=c;
while(c[0]=='\n')
c++;
for(i=j=0;i<l;i++,j++)
{
while(name[i]==' ') i++;
while(c[j]==' ') j++;
if(!c[j] || name[i]!=c[j])
{failed=1;break;}
}
if(!failed)
{
char* old=*original;
char* end=strstr(c,"\n\n");
*start=0;
if(end)
*original=MallocString(ConcatStrings(2,*original,end));
else
if(start==*original)
*original=NULL;
else
*original=MallocString(*original);
if(end)
*end=0;
c=CopyString(&c[j+1]);
Free(old);
break;
}
}
while((c=strstr(c,"\n\n")));
}
return(c);
}
/*++++++++++++++++++++++++++++++++++++++
Tidy up the current comment string by snipping off trailing and leading junk.
char **string The string that is to be tidied.
++++++++++++++++++++++++++++++++++++++*/
static void TidyCommentString(char **string)
{
int whitespace;
char *to=*string,*from=*string,*str;
if(!*string)
return;
/* Remove CR characters. */
while(*from)
{
if(*from=='\r')
from++;
else
*to++=*from++;
}
*to=0;
/* Remove leading blank lines. */
whitespace=1;
str=*string;
do
{
if(*str!='\n')
do
{
if(*str!=' ' && *str!='\t')
whitespace=0;
}
while(*str && *++str!='\n');
if(whitespace)
*string=++str;
}
while(whitespace);
/* Remove trailing blank lines. */
whitespace=1;
str=*string+strlen(*string)-1;
do
{
if(*str!='\n')
do
{
if(*str!=' ' && *str!='\t')
whitespace=0;
}
while(str>*string && *--str!='\n');
if(whitespace)
*str--=0;
}
while(whitespace);
/* Replace lines containing just whitespace with empty lines. */
str=*string;
do
{
char *start;
whitespace=1;
while(*str=='\n')
str++;
start=str;
while(*str && *++str!='\n')
{
if(*str!=' ' && *str!='\t')
whitespace=0;
}
if(whitespace)
{
char *copy=start;
while((*start++=*str++));
str=copy;
}
}
while(*str);
}